package com.allwees.bs.module.base.service;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.allwees.bs.core.modelbase.bo.Bo;
import com.allwees.bs.core.modelbase.req.BoCrudReq;
import com.allwees.bs.core.modelbase.req.Queryable;
import com.allwees.core.common.constant.EStatus;

import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * @author mhn
 * @since 2019-10-14 16:55
 */
public interface BoService<B extends Bo> extends IService<B> {
	B findByUuid(String uuid);

	/**
	 * 检查对应uuid的对象是否存在并返回（不存在则抛出异常）
	 *
	 * @param uuid
	 * @return
	 */
	B checkByUuid(String uuid);

	/**
	 * 查询一组uuid对应的数据
	 *
	 * @param uuids
	 * @return
	 */
	List<B> findByUuids(Set<String> uuids);

	/**
	 * 查询一组uuid对应的数据
	 *
	 * @param uuids
	 * @return
	 */
	List<B> findByUuids(String... uuids);

	/**
	 * 查询一组value对应field的数据
	 *
	 * @param fieldName
	 * @param values
	 * @return
	 */
	List<B> findListByFieldValues(String fieldName, Object... values);

	/**
	 * 查询指定字段值的第一条数据
	 *
	 * @param fieldName
	 * @param value
	 * @return
	 */
	B findOneByField(String fieldName, String value);

	/**
	 * 查询指定字段值的唯一1条数据(如果超过1条，会抛出异常)
	 *
	 * @param fieldName
	 * @param value
	 * @return
	 */
	B findUniqueByField(String fieldName, String value);

	/**
	 * 查询符合条件的总数
	 *
	 * @param req
	 * @return
	 */
	<P extends Queryable<B>> int findCount(P req);

	/**
	 * 查询符合条件的第1条数据
	 *
	 * @param <P>
	 * @param req
	 * @return
	 */
	<P extends Queryable<B>> B findOne(P req);

	/**
	 * 查询符合条件的唯一1条数据(如果超过1条，会抛出异常)
	 *
	 * @param clazz
	 * @param req
	 * @param fields
	 *            - 指定要返回的字段
	 * @return
	 */
	<P extends Queryable<B>> B findUnique(P req);

	/**
	 * 查询符合条件的所有数据
	 *
	 * @param req
	 * @return
	 */
	<P extends Queryable<B>> List<B> findList(P req);

	/**
	 * 按定制分页条件查询一个分页数据
	 *
	 * @param page
	 * @param req
	 * @return
	 */
	<P extends Queryable<B>> IPage<B> findPage(Page<B> page, P req);

	/**
	 * 根据req创建
	 * @param req
	 * @return
	 */
	boolean create(BoCrudReq<B> req);

	/**
	 * 创建一个新Bo
	 *
	 * @param bo
	 * @return
	 */
	boolean create(B bo);

	/**
	 * 更新Bo全部字段，null值根据字段的 {@link TableField.updateStrategy} 属性更新
	 *
	 * @param req
	 * @return
	 */
	boolean updateByUuid(BoCrudReq<B> req);

	/**
	 * 更新Bo全部字段，null值根据字段的 {@link TableField.updateStrategy} 属性更新
	 *
	 * @param bo
	 * @return
	 */
	boolean updateByUuid(B bo);

	/**
	 * 批量更新状态
	 *
	 * @param bo
	 * @param uuids
	 * @return
	 */
	int updateStatusByUuids(EStatus status, String... uuids);

	int updateStatusByUuids(EStatus status, Collection<String> uuids);

	/**
	 * 删除指定uuid的数据
	 *
	 * @param uuid
	 * @return
	 */
	boolean deleteByUuid(String uuid);

	/**
	 * 批量删除指定uuid的数据
	 *
	 * @param uuids
	 * @return
	 */
	int deleteByUuids(String... uuids);
}
